package com.ig.presentacion.modelos.desembolso.calculos;

//import com.ig.utilitarios.Modalidad;

/**
 * Clase encargada de generar los planes de amortizaci?n
 * 	1	Cuota Variable, TasaVariable
 * 	2	Cuota Variable, Tasa Fija
 * 	3	Cuota Fija, Tasa Fija
 * 
 * Cada uno de estos metodos supone
 * 	que el interes ya esta convertido a la frecuencia
 * 		
 * @author jsanchez
 *
 */
public class CuotaVariableTasaFija{
	private int periodoGracia=0;
    private Fechas fechas= null;	
	boolean debug=false;

	public CuotaVariableTasaFija(Fechas fechas){
		this.fechas= fechas;
	}
	
	public void setPeriodoGracia(int periodoGracia) {
		this.periodoGracia = periodoGracia;
	}
	
	public CuotaVariableTasaFija(Fechas fechas,boolean debug){
		this.fechas= fechas;
		this.debug=debug;
	}
	
//	/**
//	 * @param fechaPagoInicial 
//	 * 
//	 * Ejemplo: 05052006 
//	 */
//	public void setFechaPagoInicial(String fechaPagoInicial) {	
//		fechas.setDia(fechaPagoInicial.substring(0,2));
//		fechas.setMes(fechaPagoInicial.substring(2,4));	
//		fechas.setAnno(fechaPagoInicial.substring(4,8));
//	}
//	
//	/**
//	 * @param frecuencia 
//	 * :puede ser 
//	 * 	Fechas.DIARION=1
//	 * 	Fechas.SEMANAL=2
//	 * 	Fechas.MENSUAL=3
//	 * 	Fechas.TRIMESTRAL=4
//	 * 	Fechas.SEMESTRAL=5
//	 * 	Fechas.ANUAL=6
//	 */
//	public void setTipoFrecuencia(int tipoFrecuencia) {
//		this.fechas.setTipoFrecuencia(tipoFrecuencia);
//	}
//	
//	/**
//	 * tipo de calendario para el calculos de los intereses
//	 * 
//	 * @param calendarioCalculoInteres
//	 * 	puedes ser:
//	 *  
//	 * 	Calendarios.CALENDARIO_REAL=1 todos los a?os son de 365 o 366 dias y los meses de 28, 29, 30, 31 dias
//	 * 	Calendarios.CALENDARIO_COMERCIAL=2 todos los a?os tines 360 dias u los meses de 30 dias
//	 * 	Calendarios.CALENDARIO_365=3 todos los meses tienen 365 dias y los meses de 28, 30, 31 dias  
//	 */
//	public void setCalendarioCalculoInteres(int calendarioCalculoInteres) {
//		this.fechas.setCalendarioCalculoInteres(calendarioCalculoInteres);
//	}	
//
//    /**
//     * calcula el plan de amortizacion para cuotas varibles y tasa variables
//     *      
//     * @param monto 				: valor	desembolsado
//     * @param interesVariable	: vector de intereses ya convertidos a frecuencia de pago
//     * @param plazo				: frecuencia de pago
//     * @return					: matriz con filas=plazo.leng & columnas 5[fecha, cuota, interes, capital, saldocapital]
//     */
//    public Object[][] calcularPlanCuotaVariableTasaVariable(double monto, Double[] interesVariable, int plazo){
//
//	Double cuotas=(monto/plazo);
//	if(debug){
//		System.out.println("VALOR MONTO:"+monto);
//	}
//	Double calculoInteres=0.0;
//	Double calculoCapital=0.0;
//	Double saldo=monto;
//	Object[][] vPlan= new Object[plazo][6];
//	
//	Double[] IntereesReal= new Double[plazo];	
//	for (int i = 0; i < IntereesReal.length; i++) {
//		if(interesVariable.length>i){
//    			if(interesVariable[i]==null)
//    				IntereesReal[i]=Double.parseDouble("0");
//    			else IntereesReal[i]=interesVariable[i];
//		}else IntereesReal[i]=Double.parseDouble("0");
//	}
//	
//	
//	int Ncuota=0;
//	for (int i = 1; i <= plazo; i++) {
//		Ncuota=0;
//		vPlan[i-1][Ncuota]=Double.valueOf(i);
//			Ncuota++;
//		if(i<=periodoGracia)	calculoInteres=0.0;
//		else calculoInteres=Double.valueOf(Math.round(saldo*IntereesReal[i-1]));
//		vPlan[i-1][Ncuota]=fechas.getFecha();
//			Ncuota++;
//		vPlan[i-1][Ncuota]=cuotas+calculoInteres;
//			Ncuota++;				
//		vPlan[i-1][Ncuota]=calculoInteres;
//			Ncuota++;
//		calculoCapital=cuotas;
//		vPlan[i-1][Ncuota]=calculoCapital;
//			Ncuota++;
//		saldo-=calculoCapital;
//		vPlan[i-1][Ncuota]=saldo;
//			Ncuota++;
//	}
//	if(debug){
//		System.out.println("		CUOTA		FECHA			CUOTAS		INTERES		CAPITAL		SALDO");
//		System.out.println("	*********************************************************************************************");
//	}
//		for (int i = 0; i < plazo; i++) {
//			for (int j = 0; j < 6; j++) {
//				if(j==1){
//					String fecha=null;;
//					String myFecha=String.valueOf(Math.round((Double)vPlan[i][j]));
//					if(myFecha.length()==8){
//						fecha=myFecha.substring(0,2)+"/"+myFecha.substring(2,4)+"/"+myFecha.substring(4,8);
//						if(debug)System.out.print("		"+fecha);								
//					}
//					if(myFecha.length()==7){
//						fecha=myFecha.substring(0,1)+"/"+myFecha.substring(1,3)+"/"+myFecha.substring(3,7);
//						if(debug)System.out.print("		"+fecha);
//					}
//					vPlan[i][j]=fecha;
//				}else
//					if(debug){
//						System.out.print("		"+Math.round((Double)vPlan[i][j]));
//						System.out.print("\n");
//					}
//			}
//		}
//		if(debug)System.out.println("	*********************************************************************************************");
//		return vPlan;
//}    
//    
//
//
//    /**
//     * calcula el plan de amortizacion para cuotas fijas y tasa fija
//     * 
//     * @param monto 				: valor	desembolsado
//     * @param interesVariable	: vector de intereses ya convertidos a frecuencia de pago
//     * @param plazo				: frecuencia de pago
//     * @modalidad				: vencida o anticipada
//     * @return					: matriz con filas=plazo.leng & columnas 5[fecha, cuota, interes, capital, saldocapital]
//     */
//    public Object[][] calcularPlanCuotaFijaTasaFija(Double monto, Double interes, Integer plazo, Integer modalidad){
//		Double sub1;
//		Double sub2;
//		Double sub3;
//		Double cuotas=0.0;
//    	
//		if(modalidad==Modalidad.VENCIDA){
//			sub1=monto;
//			sub2=Math.pow(1+interes,plazo)-1;
//			sub3=interes*Math.pow((1+interes),plazo);
//			
//			cuotas=(sub1/(sub2/sub3));	
//			
//		}else if(modalidad==Modalidad.ANTICIPADA){
//			
//			sub1=monto;
//			sub2=Math.pow(1+interes,plazo)-1;
//			sub3=interes*Math.pow((1+interes),(plazo-1));
//			
//			cuotas=(sub1/(sub2/sub3));
//			
//			monto-=cuotas;
//		}
//		cuotas=Double.valueOf(Math.round(cuotas));
//		if(debug){
//			System.out.println("VALOR CUOTA:"+cuotas);
//			System.out.println("VALOR MONTO:"+monto);
//		}
//		
//		Double calculoInteres=0.0;
//		Double calculoCapital=0.0;
//		Double saldo=monto;
//		Double interestmp=0.0;
//		Object[][] vPlan= new Object[plazo][6];
//
//		int Ncuota=0;
//		for (int i = 1; i <= plazo; i++) {
//			Ncuota=0;
//			vPlan[i-1][Ncuota]=Double.valueOf(i);
//				Ncuota++;
//			
//			vPlan[i-1][Ncuota]=fechas.getFecha();
//				Ncuota++;
//				calculoInteres=Double.valueOf(Math.round(saldo*interes));	
//				interestmp=calculoInteres;
//			if(i<=periodoGracia){	
//				vPlan[i-1][Ncuota]=cuotas-calculoInteres;				
//				calculoInteres=0.0;
//			}else
//				vPlan[i-1][Ncuota]=cuotas;			
//				Ncuota++;			
//			vPlan[i-1][Ncuota]=calculoInteres;
//				Ncuota++;
//			if(i<plazo /*|| modalidad == Modalidades.VENCIDA*/)	
//				calculoCapital=cuotas-interestmp;
//			else
//				calculoCapital=saldo;
//			vPlan[i-1][Ncuota]=calculoCapital;
//				Ncuota++;
//			saldo-=calculoCapital;
//			vPlan[i-1][Ncuota]=saldo;
//				Ncuota++;
//			//if(saldo<0)saldo=0;			
//			//System.out.println(i+"	-	"+cuotas+"	-	"+calculoInteres+"	-	"+calculoCapital+"	-	"+saldo);			
//		}
//		if(debug){
//			System.out.println("		CUOTA		FECHA			CUOTAS		INTERES		CAPITAL		SALDO");
//			System.out.println("	*********************************************************************************************");
//		}
//			for (int i = 0; i < plazo; i++) {
//				for (int j = 0; j < 6; j++) {
//					if(j==1){
//						String fecha=null;;
//						String myFecha=String.valueOf(Math.round((Double)vPlan[i][j]));
//						if(myFecha.length()==8){
//							fecha=myFecha.substring(0,2)+"/"+myFecha.substring(2,4)+"/"+myFecha.substring(4,8);
//							if(debug)System.out.print("		"+fecha);								
//						}
//						if(myFecha.length()==7){
//							fecha=myFecha.substring(0,1)+"/"+myFecha.substring(1,3)+"/"+myFecha.substring(3,7);
//							if(debug)System.out.print("		"+fecha);
//						}
//						vPlan[i][j]=fecha;
//					}else
//						if(debug){
//							System.out.print("		"+Math.round((Double)vPlan[i][j]));
//							System.out.print("\n");
//						}
//				}
//			}
//			if(debug)System.out.println("	*********************************************************************************************");
//		//}
//    		return vPlan;
//    }
 
    /**
     * calcula el plan de amortizacion para cuotas varibles y tasa fija
     * @param monto 				: valor	desembolsado
     * @param interes			: interes ya convertido a frecuencia de pago
     * @param plazo				: es la frecuencia de pago
     * @param capital			: vector de abonos a capital en frecuencias preferidas 
     * 								ej:
     *      								Double[] vector= new Vector[4];      								
     * 									vector[1-1]=2000000;
     * 									vector[4-1]=2000000;
     * 										No implica que las demas pocisiones sean nulas.
     * @return					: matriz con el plan acalculado
     */
    public Object[][] calcularPlanCuotaVariableTasaFija(Double monto, double interes, Integer plazo,Double[] abonoCapital){
	
    	Double[] capitalReal= new Double[plazo];	
    	for (int i = 0; i < capitalReal.length; i++) {
		if(abonoCapital.length>i){
	    		if(abonoCapital[i]==null) capitalReal[i]=Double.parseDouble("0");
			else capitalReal[i]=abonoCapital[i];
		}else capitalReal[i]=Double.parseDouble("0");
	}

	Double calculoInteres=0.0;
	Double calculoCapital=0.0;
	Double saldo=monto;
	
	Object[][] vPlan= new Object[plazo][6];
	
	int Ncuota=0;
	for (int i = 1; i <= plazo; i++) {
		Ncuota=0;		
		vPlan[i-1][Ncuota]=Double.valueOf(i);
			Ncuota++;
        vPlan[i-1][Ncuota]=fechas.getFecha();
			Ncuota++;		
		if(i<=periodoGracia)	calculoInteres=0.0;
		else calculoInteres=Double.valueOf(Math.round(saldo*interes));
		vPlan[i-1][Ncuota]=capitalReal[i-1]+calculoInteres;
			Ncuota++;		
		vPlan[i-1][Ncuota]=calculoInteres;
			Ncuota++;		
		calculoCapital=capitalReal[i-1];
		vPlan[i-1][Ncuota]=calculoCapital;
			Ncuota++;
		saldo-=calculoCapital;
		vPlan[i-1][Ncuota]=saldo;
			Ncuota++;			
	}
	if(debug){
		System.out.println("		CUOTA		FECHA			CUOTAS		INTERES		CAPITAL		SALDO");
		System.out.println("	*********************************************************************************************");
	}
		for (int i = 0; i < plazo; i++) {
			for (int j = 0; j < 6; j++) {
				if(j==1){
					String fecha=null;;
					String myFecha=String.valueOf(Math.round((Double)vPlan[i][j]));
					if(myFecha.length()==8){
						fecha=myFecha.substring(0,2)+"/"+myFecha.substring(2,4)+"/"+myFecha.substring(4,8);
						if(debug)System.out.print("		"+fecha);								
					}
					if(myFecha.length()==7){
						fecha=myFecha.substring(0,1)+"/"+myFecha.substring(1,3)+"/"+myFecha.substring(3,7);
						if(debug)System.out.print("		"+fecha);
					}
					vPlan[i][j]=fecha;
				}else
					if(debug){
						System.out.print("		"+Math.round((Double)vPlan[i][j]));
						System.out.print("\n");
					}
			}
		}
		if(debug)System.out.println("	*********************************************************************************************");
	//}
		return vPlan;
}
}